package ar.edu.utn.frba.dds.opendesigners;

import java.math.BigDecimal;
import java.util.ArrayList;

import ar.edu.utn.frba.dds.opendesigners.excepciones.ExcepcionParametroDeBusqueda;
import ar.edu.utn.frba.dds.opendesigners.resultados.ResultadoBusqueda;

public class ParametroBusqueda{
	private AgenteDeViaje agenteDeViajes = AgenteDeViaje.getInstance();
	private String origen = "";
	private String destino = "";
	private String fecha = ""; //La fecha tiene que estar entre la fecha de salida y llegada
	private ArrayList<String> tipoAsiento;	//Lista de asientos que se pueden buscar
	private char ubicacion;
	private BigDecimal precioMinimo;
	private BigDecimal precioMaximo;
	private Boolean incluyeAsientosReservados;
	private Boolean incluyeVuelosConEscalas;
	

	public ParametroBusqueda(String origen, String destino, String fecha) {
		
		this.setOrigen(origen);
		this.setDestino(destino);
		this.setFecha(fecha);
		this.setTipoAsiento(null);
		this.setPrecioMinimo(new BigDecimal(0));
		this.setPrecioMaximo(new BigDecimal(0));
		this.setIncluyeAsientosReservados(false);
		this.setIncluyeVuelosConEscalas(false);
	}
	
	public void setOrigen(String origen) {
//		try {
//			this.origen = new String(origen);
//		} catch (NullPointerException exception) {
//			throw new ExcepcionNegocio("El parametro ciudad de origen es obligatorio");
//		}
		if(origen != null)
			this.origen = new String(origen);
		this.origen = origen;
	}

	public void setDestino(String destino) {
//		try {
//			this.destino = new String(destino);
//		} catch (NullPointerException exception) {
//			throw new ExcepcionNegocio("El parametro ciudad de destino es obligatorio");
//		}
		if(destino != null)
			this.destino = new String(destino);
		this.destino = destino;
	}

	public void setFecha(String fecha){
		try {
			this.fecha = new String(fecha);
		} catch (NullPointerException exception) {
			throw new ExcepcionParametroDeBusqueda("Debe ingresar una fecha");
		}
	}

	public void setUbicacion(char seatLocation) {
		this.ubicacion = seatLocation;
	}
	
	public void setTipoAsiento(ArrayList<String> tipoAsiento) {
		try {
			this.tipoAsiento = new ArrayList<String>(tipoAsiento);
		} catch (NullPointerException exception) {
			this.tipoAsiento = new ArrayList<String>();
		}
	}

	public void setPrecioMinimo(BigDecimal precio){
		this.precioMinimo = precio;
	}
	
	public void setPrecioMaximo(BigDecimal precio){
		this.precioMaximo = precio;
	}
	
	public void setIncluyeAsientosReservados(Boolean incluirReservado){
		this.incluyeAsientosReservados = incluirReservado;
	}
	
	public void setIncluyeVuelosConEscalas(Boolean incluir){
		this.incluyeVuelosConEscalas = incluir;
	}
	
	public char getUbicacion() {
		return this.ubicacion;
	}
	
	public ArrayList<String> getTipoAsiento() {
		return this.tipoAsiento;
	}
	
	public String getOrigen(){
		return this.origen;
	}
	
	public String getDestino(){
		return this.destino;
	}
	
	public String getFecha(){
		return this.fecha;
	}
	
	public BigDecimal getPrecioMinimo(){
		return this.precioMinimo;
	}
	
	public BigDecimal getPrecioMaximo(){
		return this.precioMaximo;
	}
	
	public Boolean getIncluyeAsientosReservados(){
		return this.incluyeAsientosReservados;
	}
	
	public Boolean getIncluyeVuelosConEscalas(){
		return this.incluyeVuelosConEscalas;
	}
	
	public Boolean destinoPresente(){
		return this.destino.isEmpty();
	}
	
	public ResultadoBusqueda buscar(){
		return this.agenteDeViajes.buscar(this);
	}
	
	//Copia profunda del objeto. NO uso clone() porque hace shallow copy
	public ParametroBusqueda copia() {
		ParametroBusqueda parametroBusquedaNuevo = new ParametroBusqueda(this.getOrigen(), this.getDestino(), this.getFecha());
		this.setTipoAsiento(this.getTipoAsiento());
		this.setPrecioMinimo(new BigDecimal(this.getPrecioMinimo().intValue()));
		this.setPrecioMaximo(new BigDecimal(this.getPrecioMaximo().intValue()));
		this.setIncluyeAsientosReservados(this.getIncluyeAsientosReservados());
		this.setIncluyeVuelosConEscalas(this.getIncluyeVuelosConEscalas());
		return parametroBusquedaNuevo;
	}
}
